﻿''=============================================================================
''OMANE - Outils de calcul actuariat emprunteur
''Copyright © 2010 PIERRE TISSOT CONSEIL / NATIXIS ASSURANCES
''=============================================================================
Imports PTIC_Util
Imports System.Data.OleDb
Imports System.Collections.ObjectModel

''' <summary>
''' Parametre representant la selection médicale
''' </summary>
''' <remarks></remarks>
<Serializable()> Public Class ParametreSelectionMedicale
    Inherits BaseParametre

#Region "Variables de classe"

    ''' <summary>
    ''' Nom de la colonne représentant le nombre d'années après la souscription à prendre en compte pour la sélection médicale
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared nomNbAnneesDeroulement As String = "nbAnneesDerlt"

    ''' <summary>
    ''' Nom de la colonne représentant le coefficient d'abattement à appliquer sur la mortalité
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared nomAbattementSelMedi As String = "abatSelMedic"

    ''' <summary>
    ''' Description de la colonne représentant le coefficient d'abattement à appliquer sur la mortalité
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared descAbattementSelMedi As String = "Abattement sur le taux de mortalité"

    ''' <summary>
    ''' Description de la colonne représentant le nombre d'années de déroulement après la souscription
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared descNbAnneesDeroulement As String = "Année de déroulement depuis la souscription"


    Protected _valeurUniqueSave As Double()
    Protected _maxDeroulement As Integer
#End Region

#Region "Création d'une instance"
    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <param name="nom"></param>
    ''' <param name="description"></param>
    ''' <param name="methodes_calcul"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal nom As String, _
                   ByVal description As String, _
                   ByVal methodes_calcul As Boolean(), _
                   Optional ByVal initialValue As DataTable = Nothing)
        MyBase.new(nom, description, methodes_calcul)
        _nom = nom
        _description = description
        Methode_Cal = methodes_calcul
        If Not initialValue Is Nothing Then
            _valeurs = initialValue
        Else
            Reset()
        End If
    End Sub

    Public Sub Reset()
        Dim TValeurs As New DataTable
        TValeurs.Columns.Add(nomNbAnneesDeroulement, GetType(Integer))
        TValeurs.Columns.Add(nomAbattementSelMedi, GetType(Double))
        Dim row1 As DataRow = TValeurs.NewRow
        row1(nomNbAnneesDeroulement) = 1
        row1(nomAbattementSelMedi) = 0.05
        TValeurs.Rows.Add(row1)
        Dim row2 As DataRow = TValeurs.NewRow
        row2(nomNbAnneesDeroulement) = 2
        row2(nomAbattementSelMedi) = 0.025
        TValeurs.Rows.Add(row2)
        _valeurs = TValeurs
        _maxDeroulement = 2
        If ListeSegments.Count > 0 Then
            ListeSegments.Clear()
        End If
    End Sub

#End Region

#Region "Propriétés"
#Region "Type"
    ''' <summary>
    ''' Type
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides ReadOnly Property type() As System.Type
        Get
            Return GetType(Double())
        End Get
    End Property
#End Region
#Region "Valeur en cours (pour les moteurs de calcul) -> dble()"
    ''' <summary>
    ''' Valeur en cours
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Property ValeurEnCoursAsObject As Object
        Get
            Return _valeurCourante
        End Get
        Set(ByVal value As Object)
            _valeurCourante = value
        End Set
    End Property
    ''' <summary>
    ''' Valeur en cours du paramètre (pour les moteurs de calcul)
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ValeurEnCours() As Double()
        Get
            Return _valeurCourante
        End Get
        Set(ByVal value As Double())
            _valeurCourante = Valeurs
        End Set
    End Property
#End Region
#Region "Valeurs"
    ''' <summary>
    ''' Valeurs (au format DataTable)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Property Valeurs As DataTable
        Get
            Return MyBase.Valeurs
        End Get
        Set(ByVal value As DataTable)
            MyBase.Valeurs = value
        End Set
    End Property
#End Region
#Region "Valeur unique"
    ''' <summary>
    ''' Valeur unique du paramètre
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides ReadOnly Property ValeurUniqueAsObject As Object
        Get
            Return ValeurUnique()
        End Get
    End Property

    ''' <summary>
    ''' Valeur unique du paramètre
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ValeurUnique() As Double()
        Get
            If Nature <> ParamNature.Unique Then
                Return Nothing
            End If
            Dim result(_valeurs.Rows.Count - 1) As Double
            For Each r As DataRow In _valeurs.Rows
                result(r(nomNbAnneesDeroulement) - 1) = r(nomAbattementSelMedi)
            Next
            Return result
        End Get
        Set(ByVal value As Double())
            If value Is Nothing Then
                ReDim value(0)
                value(0) = 0
            End If
            ListeSegments.Clear()
            Dim TValeurs As New DataTable
            TValeurs.Columns.Add(nomNbAnneesDeroulement, GetType(Integer))
            TValeurs.Columns.Add(nomAbattementSelMedi, GetType(Double))
            Dim row As DataRow
            For i As Integer = 0 To value.Count - 1
                row = TValeurs.NewRow
                row(nomNbAnneesDeroulement) = i + 1
                row(nomAbattementSelMedi) = value(i)
                TValeurs.Rows.Add(row)
            Next
            _valeurs = TValeurs
            _maxDeroulement = TValeurs.Rows.Count
            RaiseEventHasChanged(Me, New EventArgs)
        End Set
    End Property
#End Region
#Region "Nombre de déroulements à prendre en compte par le paramétrage"
    ''' <summary>
    ''' Nombre maximum de déroulement
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property maxDeroulement() As Integer
        Get
            Return _maxDeroulement
        End Get
        Set(ByVal value As Integer)
            If value <> _maxDeroulement And value >= 1 Then
                modifNbMaxDeroulement(value)
                _maxDeroulement = value
                RaiseEventHasChanged(Me, New EventArgs)
            End If
        End Set
    End Property
    ''' <summary>
    ''' S'exécute lorsque le nombre de déroulements maximum est modifié
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub modifNbMaxDeroulement(ByVal nouveauNbMaxDeroulement As Integer)
        'On prend la table des valeurs, pour chaque occurrence d'un segment, on ajoute ou on retire une ligne
        If nouveauNbMaxDeroulement < _maxDeroulement Then
            Dim nouvellesValeurs As DataTable
            Dim query = _
                From valeur In _valeurs.AsEnumerable _
                Where valeur.Field(Of Integer)(nomNbAnneesDeroulement) <= nouveauNbMaxDeroulement _
                Select valeur
            nouvellesValeurs = query.CopyToDataTable
            For Each col As DataColumn In _valeurs.Columns
                nouvellesValeurs.Columns(col.ColumnName).Caption = _valeurs.Columns(col.ColumnName).Caption
            Next
            _valeurs = nouvellesValeurs
        Else
            Dim nouvellesValeurs As New DataTable
            For Each col As DataColumn In _valeurs.Columns
                nouvellesValeurs.Columns.Add(col.ColumnName, col.DataType)
                nouvellesValeurs.Columns(col.ColumnName).Caption = _valeurs.Columns(col.ColumnName).Caption
            Next
            For Each row As DataRow In _valeurs.Rows
                If row(nomNbAnneesDeroulement) = _maxDeroulement Then
                    Dim newRow As DataRow = nouvellesValeurs.NewRow
                    For Each col As DataColumn In _valeurs.Columns
                        newRow(col.ColumnName) = row(col.ColumnName)
                    Next
                    nouvellesValeurs.Rows.Add(newRow)
                    For i As Integer = 1 To nouveauNbMaxDeroulement - _maxDeroulement
                        newRow = nouvellesValeurs.NewRow
                        For Each col As DataColumn In _valeurs.Columns
                            newRow(col.ColumnName) = row(col.ColumnName)
                        Next
                        newRow(nomNbAnneesDeroulement) = _maxDeroulement + i
                        newRow(nomAbattementSelMedi) = 0
                        nouvellesValeurs.Rows.Add(newRow)
                    Next
                Else
                    Dim newRow As DataRow = nouvellesValeurs.NewRow
                    For Each col As DataColumn In _valeurs.Columns
                        newRow(col.ColumnName) = row(col.ColumnName)
                    Next
                    nouvellesValeurs.Rows.Add(newRow)
                End If
            Next
            _valeurs = nouvellesValeurs
        End If
    End Sub
#End Region
#End Region

    Public Overrides Sub MAJValeurs()
        _SelectionMedicale_Etat.MAJValeurs()
    End Sub
    Protected _SelectionMedicale_Etat As New ParametreSelectionMedicale_Etat(Me)
    Protected Overrides Sub onListeSegmentsChanged(ByVal sender As Object, ByVal e As System.Collections.Specialized.NotifyCollectionChangedEventArgs)
        MyBase.onListeSegmentsChanged(sender, e)
        _SelectionMedicale_Etat.onListeSegmentsChanged(sender, e)
    End Sub
    Public Overrides Sub Deserialize(ByVal param As IParametre)
        If param.Nom = Me.Nom And TypeOf param Is ParametreSelectionMedicale Then
            Dim paramSave As ParametreSelectionMedicale = DirectCast(param, ParametreSelectionMedicale)
            If paramSave.Nature = ParamNature.Unique Then
                Me.ValeurUnique = paramSave.ValeurUnique
            ElseIf param.Nature = ParamNature.Declinee Then
                _SelectionMedicale_Etat.Deserialize(paramSave)
            End If
        End If
    End Sub

End Class